package com.bird.extension.generic;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Author: sijunqiang
 * @Date: 2020/3/29 10:35
 * @Description: The class focuses on the use of generics.
 * ==================three question?=========================================
 * one: what is a generic ?
 * 泛型是 通过参数化类型来实现在同一份代码上操作多种数据类型的 技术。利用“参数化类型”将类型抽象化，从而实现灵活的复用。
 * two: the role of generics?
 * 降低代码的耦度, 提高编码的效率，泛型主要提高了代码的重用性
 * three: how are generics used?
 * use code
 */
public class GenericDemoMain {
/**
 * ##===========================================泛型的知识点======================================================================##
 *    zero: 泛型类 泛型方法 泛型接口
 *    one: 泛型不支持基本的数据类型.
 *    two：泛型的相关的信息不会进运行期,只会在编译器有效
 *    three: 泛型的上下限 可以解决泛型类的继承关系  【上限<? extend E >】 【下限< E super ?>】
 *    four:  泛型方法经常用于数据类型的生产工厂接口中
 *     five:  E -element 在集合中使用, T-type 在类上面使用  K-key:键 V-value：值 N-number :数值类型
 * */


    /**
     * 泛型的简单的使用
     *
     * @param args
     */
    public static void main1(String[] args) {
        Logger logger = LoggerFactory.getLogger(GenericDemoMain.class);
        //创建一个string类型的泛型类
        GenericClassExample<String> stringGenericClassExample = new GenericClassExample<String>("hello world");
        //创建一个integer类型的泛型类
        GenericClassExample<Integer> integerGenericClassExample = new GenericClassExample<Integer>(123);
        //获取外部传入的类型
        System.out.println(stringGenericClassExample.getMember().getClass());
        System.out.println(integerGenericClassExample.getMember().getClass());
        //上限方法的使用
        handleExtendsMember(integerGenericClassExample);
    }

    /**
     * <P>泛型的上限</P>
     * 定义一个泛型方法 并指定泛型的的上限为number类型
     * 解释 当调用这个方法时,传入的参数必须是继承number的子类或者是number类型
     */
    public static void handleExtendsMember(GenericClassExample<? extends Number> integerGenericClassExample) {
        Integer result = 111 + (Integer) integerGenericClassExample.getMember();
        System.out.println("result=" + result);
    }

    /**
     * <P>泛型的下限</P>
     * 定义一个泛型方法 并指定泛型的的下线 为Integer类型
     * 解释 当调用这个方法时需要传入的参数的类型是 是integer的子类或是integer类型的
     */
    public static void handleSuperMember(GenericClassExample<? super Integer> integerGenericClassExample) {
        Integer result = 111 + (Integer) integerGenericClassExample.getMember();
        System.out.println("result=" + result);
    }


    /**
     * 泛型方法的使用
     *
     * @param args
     */
    public static void main(String[] args) {

        //创建一个string类型的泛型类
        GenericClassExample<String> stringGenericClassExample = new GenericClassExample<String>("hello world");

        Integer[] integers = {1, 2, 3, 4, 5, 6};
        Double[] doubles = {1.2, 1.2, 1.3, 1.4, 1.5};
        Character[] characters = {'a', 'b', 'c'};

        GenericClassExample.printArray(integers);
        GenericClassExample.printArray(doubles);
        GenericClassExample.printArray(characters);
    }


}
